音乐播放应用为开发者提供了调用音频文件播放的方法。应用主要实现的功能有:播放、暂停、上一首、下一首、快进、快退等。
本示例在main路径下的resources文件夹中创建了rawfile文件夹用于存放音频文件,应用编译时将其直接打包进hap包。如果需要播放本地的音频文件,可参考从本地文件库获取媒体文件信息来获取本地文件。
设计UI界面。根据所需的界面,采用XML文件方式创建相应的布局,具体方法参见XML创建布局。
设置遥控器响应,具体方法参见6。
创建资源服务管理ResourceServiceManager类,在内部初始化音乐列表。
创建音乐信息模型类AudioModel,包含音乐名称title、作者artist、音乐源文件src、显示图像image等信息。
public AudioModel(String title, String artist, String src, int image) {
this.title = title;
this.artist = artist;
this.lyric = String.format(Locale.ENGLISH, DUMMY_LRC, title, artist);
this.src = Const.ASSETS_CACHE_BASE + src;
this.image = image;
}
以AudioModel为元素类型创建音乐播放列表playList,并对其进行初始化。
public void initSongList(int cIndex) {
playList.add(new AudioModel(“Test Audio No.1”, “Bowers”, “test.aac”, ResourceTable.Media_no_one));
playList.add(new AudioModel(“Test Audio No.2”, “Cahill”, “test.m4a”, ResourceTable.Media_no_two));
if (cIndex > 0) {
currentIndex = cIndex;
}
}
依据音频播放开发指导创建播放服务管理PlayManager方法类,并在其内部音乐播放、暂停、恢复等功能,以便在AbilitySlice中的调用。
public class PlayManager {
private static final int MICRO_MILLI_RATE = 1000;
private static PlayManager instance = new PlayManager();
BaseFileDescriptor assetfd = null;
private Player player;
private Context context;
private boolean isInitialized = false;
private PlayManager() {
}
public static PlayManager getInstance() {
return instance;
}
// 初始化设置
public synchronized void setup(Context context) {
if (context == null) {
return;
}
if (isInitialized) {
return;
} else {
this.context = context;
this.isInitialized = true;
}
player = new Player(this.context);
}
// 当前是否正在播放
public synchronized boolean isPlaying() {
return player.isNowPlaying();
}
public synchronized Player getPlayer() {
return player;
}
//音乐播放功能,其中filePath是指定的hap包中音频文件的路径
public synchronized boolean play(String filePath, int startMillisecond) {
if (!isInitialized) {
return false;
}
if (player != null) {
if (isPlaying()) {
player.stop();
}
player.release();
}
player = new Player(context);
try {
assetfd = this.context.getResourceManager().getRawFileEntry(filePath).openRawFileDescriptor();
} catch (IOException e) {
return false;
}
if (!player.setSource(assetfd)) {
return false;
}
if (!player.prepare()) {
return false;
}
if (startMillisecond > 0) {
int microsecond = startMillisecond * MICRO_MILLI_RATE;
if (!player.rewindTo(microsecond)) {
return false;
}
}
if (player.play()) {
return true;
} else {
return false;
}
}
// 音乐暂停功能
public synchronized void pause() {
if (player == null) {
return;
}
if (isPlaying()) {
player.pause();
}
}
// 音乐播放恢复功能
public synchronized void resume() {
if (player == null) {
return;
}
if (!isPlaying()) {
player.play();
}
}
// 获取当前音乐的总长度
public synchronized int getAudioDuration() {
if (player == null) {
return 0;
}
return player.getDuration();
}
// 获取当前音乐播放位置的时间点
public synchronized int getAudioCurrentPosition() {
if (player == null ) {
return 0;
}
return player.getCurrentTime();
}
}
开发播放上一首、下一首的功能。根据音乐列表playList中的序号index进行更新。
public AudioModel next() {
currentIndex++;
if (currentIndex >= playList.size()) {
currentIndex = 0;
}
return playList.get(currentIndex);
}
public AudioModel previous() {
currentIndex–;
if (currentIndex < 0) {
currentIndex = playList.size() – 1;
}
return playList.get(currentIndex);
}